www.gusucode.com > 小车循迹AVR版 (1) > 小车循迹AVR版 (1)/小车循迹AVR版/2012年4月25日(程序备份--能正常跑完).txt
/**** ********************************** *程序说明: *此ATmega128 *包含功能: *1、 *2、 *3、 *4、 *5、 ********************************** *文件:main.c *用途:系统主程序 *注意:系统时钟8MHZ *编译环境:Code VisionAVR ********************************** *版本:循迹小车v1.0 *作者:吾ARM1 *修改时间?012年4月19日 *完成时间:2012年4月16日 **********************************/ #include<mega128.h> #include "delay.h" #define left1 PORTC.0 #define left2 PORTC.1 #define min PORTC.2 #define right1 PORTC.3 #define right2 PORTC.4 #define Turn_Left PORTC.5 #define Turn_Right PORTC.6 #define u8 unsigned char #define u16 unsigned int void Init_IO(void) { DDRC = DDRC&0xe0; //将C端口低5位定义为输入,浮空 PORTC = 0xe0;// DDRB = 0xff; //将B端口设为输出模式 PORTB = 0xff; PORTA = 0xff; DDRA = 0xff; } void Adjust_Speed(u8 Left_Speed,u8 Right_Speed) { OCR1A = (u16)Right_Speed*10 ;//Left_Speed:1--100,为右电机占空比 OCR1B = (u16)Left_Speed*10;//Right_Speed:1--100,为左电机的占空比 } void Init_Timer1(void) { u16 i,j; i = 300; //实际测试发现1600时电机速度还是很快的。 j = 300; TCCR1A = 0xa0;//相位与频率修正PWM,TOP值为ICR1,向上计数匹配清零,向下计数匹配时置1 TCCR1B = 0x12;//系统时钟8分频,A,B同时输出PWM OCR1A = i; //右电机 OCR1B = j; //在电机 ICR1 = 1000; } void main(void) { Init_IO(); Init_Timer1(); while(1) { if(PINC==0xfb)//只有中间循迹管检测到黑线11011 { Adjust_Speed(30,30);//前进 PORTA = 0xfe; } if(PINC==0xf9)//中间和左边第二个循迹管检测到黑线10011 { Adjust_Speed(20,60);//左转 // delay_ms(5); PORTA = 0xfd; } if(PINC==0xfd)//左边第二个循迹管检测到黑线10111 { Adjust_Speed(15,65);//左转 //delay_ms(5); PORTA = 0xfb; } if(PINC==0xfc)//左边两个同时检测到黑线00111 { Adjust_Speed(15,70);//左转 PORTA = 0xf7; } if(PINC==0xfe)//左边第一个循迹管检测到黑线01111 { Adjust_Speed(15,85);//左转 // delay_ms(5); PORTA = 0xef; } if(PINC==0xf3)//中间和右边第二个循迹管检测到黑线11001 { Adjust_Speed(35,15);//右转 PORTA = 0xdf; } if(PINC==0xf7)//右边第二个循迹管检测到黑线11101 { Adjust_Speed(70,13);//右转 PORTA = 0xbf; } if(PINC==0xe7)//右边两个检测到黑线11100 { Adjust_Speed(75,13);//右转 PORTA = 0x7f; } if(PINC==0xef)//右边第一个检测到黑线11110 { Adjust_Speed(96,12);//右转 PORTA = 0xfc; } if(PINC==0xe3)//右侧三个循迹管同时检测到黑线(直角)11000 { Adjust_Speed(40,0);//右转 PORTA = 0xf8; } if(PINC==0xe7)//左侧三个循迹管同时检测到黑线(直角)00011左转 { Adjust_Speed(0,40);//左转 PORTA = 0xf0; } if(PINC==0xe0)//5个循迹管同时检测到交叉00000直走 { Adjust_Speed(25,25);//直走 PORTA = 0xe0; } // if(PINC==0xff) // { // Adjust_Speed(0,100);//直走 // PORTA = 0xc0; //} } }